package entity

import (
	"errors"
	"fmt"
	"net/http"
	"os"

	"github.com/jinzhu/gorm"
	"github.com/labstack/echo"
	"shqsoft.cn/pasnj/base"
	"shqsoft.cn/pasnj/workflow"
	"shqsoft.cn/pasnj/workflow/entity"
)

//BASE_LDJS
type BASE_LDJS struct {
	ID          int    `gorm:"AUTO_INCREMENT;primary_key;column:ID"`
	FID         int    `gorm:"column:FID"`
	FRID        int    `gorm:"column:FRID"`
	UID         int    `gorm:"column:UID"`
	JSMC        string `gorm:"column:JSMC"`
	SSTX        string `gorm:"column:SSTX"`
	SSTXCaption string `gorm:"-"`

	// JSNR1   string     `gorm:"column:JSNR1"`
	// JSCP1   string     `gorm:"column:JSCP1"`
	// JSMB1   float64    `gorm:"column:JSMB1"`
	// JSQSR1  *time.Time `gorm:"column:JSQSR1"`
	// JSJZR1  *time.Time `gorm:"column:JSJZR1"`
	// JSFW1   string     `gorm:"column:JSFW1"`
	// JSFWQT1 string     `gorm:"column:JSFWQT1"`
	// JLBZ1   string     `gorm:"column:JLBZ1"`
	// ZYLX1   string     `gorm:"column:ZYLX1"`
	// ZYLXQT1 string     `gorm:"column:ZYLXQT1"`
	// JSYS1   float64    `gorm:"column:JSYS1"`

	// JSNR2   string     `gorm:"column:JSNR2"`
	// JSCP2   string     `gorm:"column:JSCP2"`
	// JSMB2   float64    `gorm:"column:JSMB2"`
	// JSQSR2  *time.Time `gorm:"column:JSQSR2"`
	// JSJZR2  *time.Time `gorm:"column:JSJZR2"`
	// JSFW2   string     `gorm:"column:JSFW2"`
	// JSFWQT2 string     `gorm:"column:JSFWQT2"`
	// JLBZ2   string     `gorm:"column:JLBZ2"`
	// ZYLX2   string     `gorm:"column:ZYLX2"`
	// ZYLXQT2 string     `gorm:"column:ZYLXQT2"`
	// JSYS2   float64    `gorm:"column:JSYS2"`
	// JSNR3   string     `gorm:"column:JSNR3"`
	// JSCP3   string     `gorm:"column:JSCP3"`
	// JSMB3   float64    `gorm:"column:JSMB3"`
	// JSQSR3  *time.Time `gorm:"column:JSQSR3"`
	// JSJZR3  *time.Time `gorm:"column:JSJZR3"`
	// JSFW3   string     `gorm:"column:JSFW3"`
	// JSFWQT3 string     `gorm:"column:JSFWQT3"`
	// JLBZ3   string     `gorm:"column:JLBZ3"`
	// ZYLX3   string     `gorm:"column:ZYLX3"`
	// ZYLXQT3 string     `gorm:"column:ZYLXQT3"`
	// JSYS3   float64    `gorm:"column:JSYS3"`
	// JSNR4   string     `gorm:"column:JSNR4"`
	// JSCP4   string     `gorm:"column:JSCP4"`
	// JSMB4   float64    `gorm:"column:JSMB4"`
	// JSQSR4  *time.Time `gorm:"column:JSQSR4"`
	// JSJZR4  *time.Time `gorm:"column:JSJZR4"`
	// JSFW4   string     `gorm:"column:JSFW4"`
	// JSFWQT4 string     `gorm:"column:JSFWQT4"`
	// JLBZ4   string     `gorm:"column:JLBZ4"`
	// ZYLX4   string     `gorm:"column:ZYLX4"`
	// ZYLXQT4 string     `gorm:"column:ZYLXQT4"`
	// JSYS4   float64    `gorm:"column:JSYS4"`
	// JSNR5   string     `gorm:"column:JSNR5"`
	// JSCP5   string     `gorm:"column:JSCP5"`
	// JSMB5   float64    `gorm:"column:JSMB5"`
	// JSQSR5  *time.Time `gorm:"column:JSQSR5"`
	// JSJZR5  *time.Time `gorm:"column:JSJZR5"`
	// JSFW5   string     `gorm:"column:JSFW5"`
	// JSFWQT5 string     `gorm:"column:JSFWQT5"`
	// JLBZ5   string     `gorm:"column:JLBZ5"`
	// ZYLX5   string     `gorm:"column:ZYLX5"`
	// ZYLXQT5 string     `gorm:"column:ZYLXQT5"`
	// JSYS5   float64    `gorm:"column:JSYS5"`

	STEP     int     `gorm:"-" json:"step"`
	Progress float64 `gorm:"-" json:"progress"`
	StepName string  `gorm:"-" json:"stepName"`
	Status   string  `gorm:"-" json:"status"`
}

//TableName 非保本理财工号维护
func (BASE_LDJS) TableName() string {
	return "T_BASE_LDJS"

}

//BeforeSave 保存前的触发器
func (i *BASE_LDJS) BeforeSave(tx *gorm.DB) (err error) {
	if i.FID == 0 {
		return errors.New("未上传附件或上传附件不正确，请删除后重新上传")
	}
	wfid := 31
	runid, err := workflow.Create(wfid, i.UID, tx)
	if err != nil {
		return err
	}
	i.FRID = runid

	return
}

// AfterFind 查询后触发器
func (i *BASE_LDJS) AfterFind(tx *gorm.DB) (err error) {
	if i.SSTX == "1" {
		i.SSTXCaption = "公司"
	} else if i.SSTX == "2" {
		i.SSTXCaption = "零售"
	}
	if i.FRID == 0 {
		i.Status = "exception"
		i.StepName = "校验错误"
		return
	}
	run := entity.FlowRun{}
	if err = tx.Find(&run, i.FRID).Error; err != nil {
		tx.Rollback()
		return
	}
	wf := workflow.GetWorkFlow(run.WFID)
	if wf == nil {
		return fmt.Errorf("指定的流程ID:%d在流程配置中不存在！", run.WFID)
	}
	act := wf.GetAction(run.Step)
	if act == nil {
		return fmt.Errorf("指定的stepID:%d在流程%s配置中不存在！", run.Step, wf.Name)
	}
	count := len(wf.Actions)
	i.STEP = run.Step
	i.StepName = "审批中"
	if i.STEP == 1 {
		i.StepName = "申请中"
	}
	i.Progress = float64(act.Step*100) / float64(count)
	if i.Progress >= 100 && run.State == "0" {
		i.Progress = 95
	}
	i.Status = ""
	if run.State == "0" {
		i.Status = "active"
	} else if run.State == "2" {
		i.StepName = "已中止"
		i.Status = "exception"
	} else {
		i.StepName = "已完成"
		i.Status = "success"
	}
	return
}

func (i *BASE_LDJS) AfterDelete(tx *gorm.DB) (err error) {
	//删除所有附件
	if i.FID > 0 {
		var fj BaseFJ
		err = base.DB.First(&fj, i.FID).Error
		if err != nil {
			return echo.NewHTTPError(http.StatusBadRequest, err.Error())
		}
		fileName := fj.FJMC + "." + fj.FJLX

		path, err := base.WorkDir()
		if err != nil {
			return echo.NewHTTPError(http.StatusBadRequest, err.Error())
		}
		filePath := path + "/upload_file/doc/" + fileName

		err = os.Remove(filePath)
		if err != nil {
			return echo.NewHTTPError(http.StatusBadRequest, err.Error())
		}
		err = base.DB.Where([]int{i.FID}).Delete(BaseFJ{}).Error
		if err != nil {
			return echo.NewHTTPError(http.StatusBadRequest, err.Error())
		}
	}
	//删除监测项目
	err = base.DB.Where("JSID = ?", i.ID).Delete(BASE_LDJS_XM{}).Error
	if err != nil {
		return echo.NewHTTPError(http.StatusBadRequest, err.Error())
	}
	//删除流程信息
	if i.FRID > 0 {
		return workflow.DeleteWithTx(i.FRID, tx)
	}
	return nil
}

//IndiYJEF 返回结构体
func BASE_LDJSEF() base.EntityFunc {
	return func() interface{} {
		entity := BASE_LDJS{}
		return &entity
	}
}

//BASE_LDJSESF 返回结构体数组
func BASE_LDJSESF() base.EntitiesFunc {
	return func() interface{} {
		var entities []BASE_LDJS
		return &entities
	}
}

func init() {
	dao := base.NewDefaultDao(BASE_LDJSEF(), BASE_LDJSESF(), nil)
	filter := base.WorkFolowFilter{
		FilterColName: "FRID",
	}
	filter.SetAdditional("wfid", "31")
	dao.Fileter = &filter
	base.DaoPoolObj.Put("BASE_LDJS", dao)
}
